package bean

import "github.com/gin-gonic/gin"

// Context 自定义上下文接口，隐藏底层框架实现
type Context interface {
	// Status 设置响应状态码
	Status(code int)
	// JSON 返回JSON响应
	JSON(code int, obj interface{})
	// String 返回字符串响应
	String(code int, format string, values ...interface{})
	// Param 获取路径参数
	Param(key string) string
	// Query 获取查询参数
	Query(key string) string
	// PostForm 获取POST表单参数
	PostForm(key string) string
	// Bind 绑定请求体到结构体
	Bind(obj interface{}) error
	// Header 获取请求头
	Header(key string) string
	// SetHeader 设置响应头
	SetHeader(key, value string)
	// GetClientIP 获取客户端IP
	GetClientIP() string
	// Method 获取HTTP方法
	Method() string
	// Path 获取请求路径
	Path() string
}

// contextWrapper gin.Context的包装器
type contextWrapper struct {
	ginCtx *gin.Context
}

// Status 设置响应状态码
func (c *contextWrapper) Status(code int) {
	c.ginCtx.Status(code)
}

// JSON 返回JSON响应
func (c *contextWrapper) JSON(code int, obj interface{}) {
	c.ginCtx.JSON(code, obj)
}

// String 返回字符串响应
func (c *contextWrapper) String(code int, format string, values ...interface{}) {
	c.ginCtx.String(code, format, values...)
}

// Param 获取路径参数
func (c *contextWrapper) Param(key string) string {
	return c.ginCtx.Param(key)
}

// Query 获取查询参数
func (c *contextWrapper) Query(key string) string {
	return c.ginCtx.Query(key)
}

// PostForm 获取POST表单参数
func (c *contextWrapper) PostForm(key string) string {
	return c.ginCtx.PostForm(key)
}

// Bind 绑定请求体到结构体
func (c *contextWrapper) Bind(obj interface{}) error {
	return c.ginCtx.ShouldBindJSON(obj)
}

// Header 获取请求头
func (c *contextWrapper) Header(key string) string {
	return c.ginCtx.GetHeader(key)
}

// SetHeader 设置响应头
func (c *contextWrapper) SetHeader(key, value string) {
	c.ginCtx.Header(key, value)
}

// GetClientIP 获取客户端IP
func (c *contextWrapper) GetClientIP() string {
	return c.ginCtx.ClientIP()
}

// Method 获取HTTP方法
func (c *contextWrapper) Method() string {
	return c.ginCtx.Request.Method
}

// Path 获取请求路径
func (c *contextWrapper) Path() string {
	return c.ginCtx.Request.URL.Path
}

// HandlerFunc 自定义处理函数类型，使用我们的Context接口
type HandlerFunc func(Context)

// wrapHandler 将自定义HandlerFunc转换为gin.HandlerFunc
func wrapHandler(handler HandlerFunc) gin.HandlerFunc {
	return func(ginCtx *gin.Context) {
		ctx := &contextWrapper{ginCtx: ginCtx}
		handler(ctx)
	}
}
